#include <ctype.h>
#include <errno.h>
#include <math.h>

        // "123",        // 整数
        // "123.45",     // 浮点数
        // "-123.45",    // 负数
        // "1e3",        // 科学计数法
        // "0.0001",     // 小数
        // "abc",        // 非法字符串
        // "123abc",     // 包含非法字符
        // "",           // 空字符串
        // "  ",         // 纯空格

// 这八个args，存到一个列表里面
double my_strtod(const char *str, char **endptr) { //args0, args1
    const char *p = str; //args2 
    double result = 0.0; //args3
    int sign = 1;  // 正负号, args4
    int exp_sign = 1; //args5
    int exponent = 0; //args6
    int decimal_places = 0; //args7
    int has_fraction = 0; //args8
    
    // 跳过空白字符, scratch里面可以跳过
    while (isspace(*p)) { 
        //*p解引用操作，在scratch里面对应的是， value_str的第(p+1)个字符
        p++;
    }

    
    // 处理正负号
    if (*p == '-') {
        sign = -1;
        p++;
    } else if (*p == '+') {
        p++;
    }
    
    // 处理整数部分
    while (isdigit(*p)) {
        result = result * 10.0 + (*p - '0');
        p++;
    }
    
    // 处理小数点和小数部分
    if (*p == '.') {
        p++;
        while (isdigit(*p)) {
            result = result * 10.0 + (*p - '0');
            decimal_places++;
            p++;
            has_fraction = 1;
        }
    }
    
    // 如果有小数部分，需要将结果除以 10 的相应次幂
    if (has_fraction) {
        result /= pow(10.0, decimal_places);
    }
    
    // 处理科学计数法
    if (*p == 'e' || *p == 'E') {
        p++;
        if (*p == '-') {
            exp_sign = -1;
            p++;
        } else if (*p == '+') {
            p++;
        }
        while (isdigit(*p)) {
            exponent = exponent * 10 + (*p - '0');
            p++;
        }
    }
    
    // 计算最终结果
    if (exponent != 0) {
        result *= pow(10.0, exp_sign * exponent);
    }
    
    // 设置结果的符号
    result *= sign;
    
    // 设置 endptr 指向第一个无法解析的字符
    if (endptr) {
        *endptr = (char *)p;
    }
    
    return result;
}
